#ifndef GrafoRamo_
#define GrafoRamo_

#include <cstddef> // NULL
template<class TV, class TR>
class Grafo;

template<class TV, class TR>
class GrafoVertice;

template<class TV, class TR> //Class representativa dos ramos que ligam vertices do grafo
class GrafoRamo {
	friend class Grafo<TV, TR> ;

private:
	TR rconteudo;
	GrafoVertice<TV, TR>* apv;
	GrafoRamo<TV, TR>* apr;

public:
	GrafoRamo();
	GrafoRamo(const TR& rcont, GrafoVertice<TV, TR>* pv);
	GrafoRamo(const GrafoRamo<TV, TR>& r);
	~GrafoRamo();

	TR getConteudo() const;
	GrafoVertice<TV, TR>* getVerticeApontado() const;
	GrafoRamo<TV, TR>* getRamoApontado() const;
};

template<class TV, class TR>
GrafoRamo<TV, TR>::GrafoRamo() {
	apv = NULL;
	apr = NULL;
}

template<class TV, class TR>
GrafoRamo<TV, TR>::GrafoRamo(const TR& rcont, GrafoVertice<TV, TR>* pv) {
	rconteudo = rcont;
	apv = pv;
	apr = NULL;
}

template<class TV, class TR>
GrafoRamo<TV, TR>::GrafoRamo(const GrafoRamo<TV, TR>& r) {
	rconteudo = r.rconteudo;
	apv = r.apv;
	apr = r.apr;
}

template<class TV, class TR>
GrafoRamo<TV, TR>::~GrafoRamo() {

}

template<class TV, class TR>
TR GrafoRamo<TV, TR>::getConteudo() const {
	return rconteudo;
}

template<class TV, class TR>
GrafoVertice<TV, TR>* GrafoRamo<TV, TR>::getVerticeApontado() const {
	return apv;
}

template<class TV, class TR>
GrafoRamo<TV, TR>* GrafoRamo<TV, TR>::getRamoApontado() const {
	return apr;
}

#endif
